package com.ocom.payconfig.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ocom.common.entity.card.EntityXfSubAccount;
import com.ocom.common.enums.DataSourceEnum;
import com.ocom.common.enums.MasterSlaveEnum;
import com.ocom.common.enums.ResultEnum;
import com.ocom.common.resp.Result;
import com.ocom.common.utils.ResultUtil;
import com.ocom.common.vo.payconfig.SubAccountVo;
import com.ocom.mysql.aspect.DataSourceAspect;
import com.ocom.payconfig.dao.IDaoXfSubAccount;
import com.ocom.payconfig.service.XfSubAccountService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Slf4j
@Service
public class XfSubAccountServiceImpl extends ServiceImpl<IDaoXfSubAccount, EntityXfSubAccount> implements XfSubAccountService {

    @Autowired
    private IDaoXfSubAccount daoXfSubAccount;

    @Override
    @DataSourceAspect(type = DataSourceEnum.PART_DB,companyId ="comId",isMaster = MasterSlaveEnum.SLAVE)
    public Result getSubAccountList(Long comId) {
        List<SubAccountVo> subAccounts = daoXfSubAccount.getSubAccounts(comId);
        if (subAccounts != null && subAccounts.size() > 0) {
            subAccounts.forEach(entityXfSubAccount -> {
                if (entityXfSubAccount.getMerchId() == 0) {
                    entityXfSubAccount.setSubAccountName("本单位");
                }
            });
        } else {
//            EntityXfSubAccount entityXfSubAccount = new EntityXfSubAccount();
//            entityXfSubAccount.setComId(comId);
//            entityXfSubAccount.setSubAccount(0);
//            entityXfSubAccount.setSubAccountName("消费");
//            entityXfSubAccount.setWalletName("子账户钱包");
//            boolean save = this.save(entityXfSubAccount);
//            if (save) {
//                subAccounts = new ArrayList<>();
//                SubAccountVo subAccountVo = JSON.parseObject(JSON.toJSONString(entityXfSubAccount), SubAccountVo.class);
//                subAccounts.add(subAccountVo);
//            }
        }

        return ResultUtil.success(subAccounts);
    }

    @Override
    @DataSourceAspect(type = DataSourceEnum.PART_DB,companyId ="comId")
    public Result setSubAccount(Long comId,SubAccountVo request) {

        LambdaQueryWrapper<EntityXfSubAccount> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(EntityXfSubAccount::getComId, request.getComId());
        queryWrapper.eq(EntityXfSubAccount::getSubAccountName,request.getSubAccountName());
        queryWrapper.ne(EntityXfSubAccount::getSubAccount,request.getSubAccount());
        EntityXfSubAccount entityXfSubAccount1 = daoXfSubAccount.selectOne(queryWrapper);
        if(ObjectUtil.isNotEmpty(entityXfSubAccount1)){
            return ResultUtil.error(ResultEnum.Err_3099);
        }

        LambdaQueryWrapper<EntityXfSubAccount> queryWrapper1 = new LambdaQueryWrapper<>();
        queryWrapper1.eq(EntityXfSubAccount::getComId, request.getComId());
        queryWrapper1.eq(EntityXfSubAccount::getSubAccount,request.getSubAccount());
        EntityXfSubAccount entityXfSubAccount2 = daoXfSubAccount.selectOne(queryWrapper1);

        EntityXfSubAccount entityXfSubAccount = new EntityXfSubAccount();
        entityXfSubAccount.setComId(request.getComId());
        entityXfSubAccount.setSubAccount(request.getSubAccount());
        entityXfSubAccount.setSubAccountName(request.getSubAccountName());
        entityXfSubAccount.setMerchId(Math.toIntExact(request.getMerchId()));
        entityXfSubAccount.setWalletName("子账户钱包");
        entityXfSubAccount.setRemark(request.getRemark());
        if(ObjectUtil.isNotEmpty(entityXfSubAccount2)){
            daoXfSubAccount.update(entityXfSubAccount,new LambdaUpdateWrapper<EntityXfSubAccount>()
                    .eq(EntityXfSubAccount::getComId,request.getComId())
                    .eq(EntityXfSubAccount::getSubAccount,request.getSubAccount()));
        }else {
            try {
                daoXfSubAccount.insert(entityXfSubAccount);
            } catch (Exception e) {
                log.info("新增失败：{}",e.getMessage());
                throw new RuntimeException(e);
            }
        }
        return ResultUtil.success();
    }


}
